package com.guangyunl.b_permission;
// 不同包子父类
import com.guangyunl.a_permission.MyClass;

public class MySon extends MyClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        // System.out.println(myClass.name01); //java: name01 在 com.guangyunl.a_permission.MyClass 中是 private 访问控制


        // ????? ---->  为什么这里不可以访问
        System.out.println("????? ---->  为什么这里不可以访问 protected");
        // System.out.println(myClass.name02); //java: name02 在 com.guangyunl.a_permission.MyClass 中是 protected 访问控制

        /*
            protected 访问修饰符意味着该成员可以在同一包内的类、继承类（无论是否在同一包中）以及当前类内访问，
            但不能在不同包中创建的非继承类中直接访问。
            在 MySon 类中，你尝试通过 myClass.name02 访问 name02，
            但是 MySon 类是不同包中的类（com.guangyunl.b_permission 和 com.guangyunl.a_permission）。
            即使 MySon 类继承自 MyClass，由于 name02 是 protected 的，它只能在继承类中访问（而不是通过非子类实例来访问）。
            结论：你不能通过 myClass.name02 直接访问，因为 name02 是 protected，你需要通过继承来访问它，或者通过 super 来访问。
         */

        // System.out.println(myClass.name03); //java: name03在com.guangyunl.a_permission.MyClass中不是公共的; 无法从外部程序包中对其进行访问
        System.out.println(myClass.name04);
        MySon mySon = new MySon();
        mySon.method01();

    }

    public  void method01(){

        // ????? ---->  为什么这里就可以访问
        System.out.println("????? ---->  为什么这里就可以访问 protected");
        System.out.println(super.name02);

        /*
            为什么在 method01() 中能够访问 super.name02？
            在 MySon 类的 method01() 方法中，super.name02 访问的是父类 MyClass 中的 protected 成员 name02。
            由于 name02 是 protected，它对继承类 MySon 是可见的。
            所以，在继承类中，super.name02 是合法的，能够访问。
            这里可以访问是因为 MySon 是 MyClass 的子类，protected 成员在子类中是可以访问的。
         */
        System.out.println("protected 可以在子类（即使它们不在同一个包中）中访问，但无法在同包外的非继承类中直接访问。\n" +
                "使用 super 可以访问父类中的 protected 成员，前提是该类是继承自父类的。");
        /*
            protected 可以在子类（即使它们不在同一个包中）中访问，但无法在同包外的非继承类中直接访问。
            使用 super 可以访问父类中的 protected 成员，前提是该类是继承自父类的。
         */
    }
}

/*
????? ---->  为什么这里不可以访问 protected
public = name04
????? ---->  为什么这里就可以访问 protected
protected = name02
protected 可以在子类（即使它们不在同一个包中）中访问，但无法在同包外的非继承类中直接访问。
使用 super 可以访问父类中的 protected 成员，前提是该类是继承自父类的。
 */